home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / scsi / scsi_eh.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  2.7 KB  |  96 lines

  1. #ifndef _SCSI_SCSI_EH_H
  2. #define _SCSI_SCSI_EH_H
  3.  
  4. #include <linux/scatterlist.h>
  5.  
  6. #include <scsi/scsi_cmnd.h>
  7. struct scsi_device;
  8. struct Scsi_Host;
  9.  
  10. /*
  11.  * This is a slightly modified SCSI sense "descriptor" format header.
  12.  * The addition is to allow the 0x70 and 0x71 response codes. The idea
  13.  * is to place the salient data from either "fixed" or "descriptor" sense
  14.  * format into one structure to ease application processing.
  15.  *
  16.  * The original sense buffer should be kept around for those cases
  17.  * in which more information is required (e.g. the LBA of a MEDIUM ERROR).
  18.  */
  19. struct scsi_sense_hdr {        /* See SPC-3 section 4.5 */
  20.     u8 response_code;    /* permit: 0x0, 0x70, 0x71, 0x72, 0x73 */
  21.     u8 sense_key;
  22.     u8 asc;
  23.     u8 ascq;
  24.     u8 byte4;
  25.     u8 byte5;
  26.     u8 byte6;
  27.     u8 additional_length;    /* always 0 for fixed sense format */
  28. };
  29.  
  30. static inline int scsi_sense_valid(struct scsi_sense_hdr *sshdr)
  31. {
  32.     if (!sshdr)
  33.         return 0;
  34.  
  35.     return (sshdr->response_code & 0x70) == 0x70;
  36. }
  37.  
  38.  
  39. extern void scsi_eh_finish_cmd(struct scsi_cmnd *scmd,
  40.                    struct list_head *done_q);
  41. extern void scsi_eh_flush_done_q(struct list_head *done_q);
  42. extern void scsi_report_bus_reset(struct Scsi_Host *, int);
  43. extern void scsi_report_device_reset(struct Scsi_Host *, int, int);
  44. extern int scsi_block_when_processing_errors(struct scsi_device *);
  45. extern int scsi_normalize_sense(const u8 *sense_buffer, int sb_len,
  46.         struct scsi_sense_hdr *sshdr);
  47. extern int scsi_command_normalize_sense(struct scsi_cmnd *cmd,
  48.         struct scsi_sense_hdr *sshdr);
  49.  
  50. static inline int scsi_sense_is_deferred(struct scsi_sense_hdr *sshdr)
  51. {
  52.     return ((sshdr->response_code >= 0x70) && (sshdr->response_code & 1));
  53. }
  54.  
  55. extern const u8 * scsi_sense_desc_find(const u8 * sense_buffer, int sb_len,
  56.                        int desc_type);
  57.  
  58. extern int scsi_get_sense_info_fld(const u8 * sense_buffer, int sb_len,
  59.                    u64 * info_out);
  60.  
  61. extern void scsi_build_sense_buffer(int desc, u8 *buf, u8 key, u8 asc, u8 ascq);
  62.  
  63. /*
  64.  * Reset request from external source
  65.  */
  66. #define SCSI_TRY_RESET_DEVICE    1
  67. #define SCSI_TRY_RESET_BUS    2
  68. #define SCSI_TRY_RESET_HOST    3
  69. #define SCSI_TRY_RESET_TARGET    4
  70.  
  71. extern int scsi_reset_provider(struct scsi_device *, int);
  72.  
  73. struct scsi_eh_save {
  74.     /* saved state */
  75.     int result;
  76.     enum dma_data_direction data_direction;
  77.     unsigned underflow;
  78.     unsigned char cmd_len;
  79.     unsigned char prot_op;
  80.     unsigned char *cmnd;
  81.     struct scsi_data_buffer sdb;
  82.     struct request *next_rq;
  83.     /* new command support */
  84.     unsigned char eh_cmnd[BLK_MAX_CDB];
  85.     struct scatterlist sense_sgl;
  86. };
  87.  
  88. extern void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd,
  89.         struct scsi_eh_save *ses, unsigned char *cmnd,
  90.         int cmnd_size, unsigned sense_bytes);
  91.  
  92. extern void scsi_eh_restore_cmnd(struct scsi_cmnd* scmd,
  93.         struct scsi_eh_save *ses);
  94.  
  95. #endif /* _SCSI_SCSI_EH_H */
  96.